package controllers

import (
	"stacks/models"
	"stacks/services"
	"stacks/utils"
	"strconv"

	"github.com/gin-gonic/gin"
)

// TenantController 租户控制器
type TenantController struct {
	tenantService *services.TenantService
}

// NewTenantController 创建租户控制器实例
func NewTenantController() *TenantController {
	return &TenantController{
		tenantService: services.NewTenantService(),
	}
}

// GetTenantList 获取租户列表
func (c *TenantController) GetTenantList(ctx *gin.Context) {
	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(ctx.DefaultQuery("pageSize", "10"))

	if page < 1 {
		page = 1
	}
	if pageSize < 1 || pageSize > 100 {
		pageSize = 10
	}

	tenants, total, err := c.tenantService.GetTenantList(page, pageSize)
	if err != nil {
		utils.InternalError(ctx, "获取租户列表失败")
		return
	}

	utils.Success(ctx, gin.H{
		"list":  tenants,
		"total": total,
		"page":  page,
		"size":  pageSize,
	})
}

// GetTenantByID 根据ID获取租户
func (c *TenantController) GetTenantByID(ctx *gin.Context) {
	id, _ := strconv.ParseUint(ctx.Param("id"), 10, 32)

	tenant, err := c.tenantService.GetTenantByID(uint(id))
	if err != nil {
		utils.NotFound(ctx, "租户不存在")
		return
	}

	utils.Success(ctx, tenant)
}

// CreateTenant 创建租户
func (c *TenantController) CreateTenant(ctx *gin.Context) {
	var tenant models.SysTenant
	if err := ctx.ShouldBindJSON(&tenant); err != nil {
		utils.BadRequest(ctx, "请求参数错误")
		return
	}

	err := c.tenantService.CreateTenant(&tenant)
	if err != nil {
		utils.BadRequest(ctx, err.Error())
		return
	}

	utils.Success(ctx, "创建成功")
}

// UpdateTenant 更新租户
func (c *TenantController) UpdateTenant(ctx *gin.Context) {
	id, _ := strconv.ParseUint(ctx.Param("id"), 10, 32)

	var updates map[string]interface{}
	if err := ctx.ShouldBindJSON(&updates); err != nil {
		utils.BadRequest(ctx, "请求参数错误")
		return
	}

	err := c.tenantService.UpdateTenant(uint(id), updates)
	if err != nil {
		utils.BadRequest(ctx, err.Error())
		return
	}

	utils.Success(ctx, "更新成功")
}

// DeleteTenant 删除租户
func (c *TenantController) DeleteTenant(ctx *gin.Context) {
	id, _ := strconv.ParseUint(ctx.Param("id"), 10, 32)

	err := c.tenantService.DeleteTenant(uint(id))
	if err != nil {
		utils.BadRequest(ctx, err.Error())
		return
	}

	utils.Success(ctx, "删除成功")
}
